package com.lpit.controller;

import com.lpit.constant.EsIndexConstant;
import com.lpit.pojo.Article;
import com.lpit.pojo.Message;
import com.lpit.pojo.User;
import com.lpit.result.ResponseResult;
import com.lpit.utils.IDUtil;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.core.Index;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("/message")
public class UserViewMessage {

    @Autowired
    private JestClient jestClient;
    /**
     * 查看关注消息
     * @return
     */
    @GetMapping("/follow.do")
    public ResponseResult<User> getFollowMessage(Integer userId) throws Exception {
        Article article = new Article();
        article.setActivityId(111);
        article.setArticleTitle("创建一个Index.Builder对象");
        article.setArticleBody("创建一个Index.Builder对象，并使用给定的文章对象进行初始化。这个对象用于构建Elasticsearch的索引操作");
        article.setArticleCover("../img");
//        article.setArticleTime(LocalDateTime.now());
        article.setArticleLink("这是链接");

        /*创建一个Index.Builder对象，并使用给定的文章对象进行初始化。这个对象用于构建Elasticsearch的索引操作。*/
        Index.Builder builder = new Index.Builder(article);
        /*设置索引操作的文档ID。这里将文章的ID转换为字符串，并设置为文档ID*/
        builder.id(article.getActivityId().toString());
        /*设置执行索引操作后立即刷新索引。当设置为true时，索引操作将立即生效并对查询可见*/
        builder.refresh(true);

        /*使用构建好的Index.Builder对象创建一个Index对象。指定索引的名称和类型*/
        Index index = builder.index(EsIndexConstant.ALL_INDEX).type("article").build();
        /*使用JestClient执行索引操作，将Index对象传递给execute()方法，返回执行结果*/
        JestResult jestResult = jestClient.execute(index);

        /*对索引操作的结果进行检查。如果结果不为空且操作失败，抛出运行时异常，同时将错误消息作为异常信息*/
        if (jestResult != null && !jestResult.isSucceeded()) {
            throw new RuntimeException(jestResult.getErrorMessage() + "插入更新索引失败");
        }

        System.out.println("插入");
        return null;
    }

    /**
     * 查看评论消息
     * @return
     */
    @GetMapping("/comment.do")
    public ResponseResult<User> getCommentMessage(Integer userId) throws IOException {
        /* 创建一个SearchSourceBuilder对象，用于构建Elasticsearch的查询条件*/
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        /*设置查询条件，这里使用matchQuery方法创建一个关键词匹配查询，查找标题中包含关键词 “Builder对象” 的文章*/
        searchSourceBuilder.query(QueryBuilders.termQuery("articleBody", "对象"));
        /*设置查询结果的起始位置，表示要从第0条记录开始获取结果*/
        searchSourceBuilder.from(0);
        /*设置返回结果的最大数量，表示要获取2条记录*/
        searchSourceBuilder.size(2);

        System.err.println(searchSourceBuilder.toString());
        /*创建一个Search对象，使用SearchSourceBuilder生成的查询条件，并指定索引名称和类型*/
        Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(EsIndexConstant.ALL_INDEX).addType("article").build();
        /*使用JestClient执行查询操作，将Search对象传递给execute()方法，返回查询结果*/
        SearchResult searchResult = jestClient.execute(search);
        /* 将查询结果转换为Article对象列表，通过getSourceAsObjectList()方法可以直接将文档源转换为指定的Java对象*/
        List<Article> sourceAsObjectList = searchResult.getSourceAsObjectList(Article.class);

        System.err.println(sourceAsObjectList.size());
        for (Article article : sourceAsObjectList) {
            System.err.println(article);
        }

        return null;
    }

    /**
     * 查看转发消息
     * @return
     */
    @GetMapping("/transpond.do")
    public ResponseResult<User> getTranspondMessage(Integer userId){
        return null;
    }

    /**
     * 查看点赞消息
     * @return
     */
    @GetMapping("/upvote.do")
    public ResponseResult<User> getUpvoteMessage(Integer userId){
        return null;
    }

    /**
     * 查看公告（系统通知）消息
     * @return
     */
    @GetMapping("/affiche.do")
    public ResponseResult<Message> getAfficheMessage(Integer userId){
        return null;
    }

}
